/**
 * @file litefoc.h
 * @author wangshixin (gin0101@126.com)
 * @brief LiteFOC 头文件
 * @version 1.0.0
 * @date 2023-09-28
 * 
 * @copyright Copyright (c) 2023
 * 
 */

#ifndef __LITEFOC_H__
#define __LITEFOC_H__


#define LITEFOC_INFINITE                0xFFFFFFFFU

// 电机最小供电电压
#define LITEFOC_MIN_POWER_VOLT          1.0f

// 默认 PID
#define LITEFOC_DEFAULT_PID_KP          0.04f
#define LITEFOC_DEFAULT_PID_KI          0.02f
#define LITEFOC_DEFAULT_PID_KD          0.01f


/**
 * @brief 电机旋转方向
 * 
 */
typedef enum
{
    eClockwise      = 0,                // 顺时针
    eAnticlockwise,                     // 逆时针
} t_eMoveDir;


/**
 * @brief LiteFOC属性结构体
 * 
 */
typedef struct                          // litefoc电机配置
{
    unsigned char   ucN;                // 电机线圈槽数
    unsigned char   ucP;                // 电机磁体极数
    float           fPowerVolt;         // 电机供电电压
    unsigned short  usKV;               // KV值（空载时每增加1伏特，转速就会增加多少转/分）
    unsigned char   ucPeriod;           // LiteFOC 任务调用周期，单位ms
} t_sLitefoc;


/**
 * @brief 初始化
 * 
 */
unsigned char litefoc_init(t_sLitefoc *sLitefoc);


/**
 * @brief 设置供电电压
 * 
 */
unsigned char litefoc_set_volt(float fVolt);


/**
 * @brief 获取当前角度
 * 
 */
float litefoc_get_angle(void);


/**
 * @brief 获取当前力矩（值被归一化）
 * 
 */
float litefoc_get_torque(void);


/**
 * @brief 配置PID值
 * 
 */
void litefoc_set_pid(float fP, float fI, float fD);


/**
 * @brief foc 循环执行
 * 
 */
unsigned char litefoc_loop(void);


/**
 * @brief foc任务执行中断调用函数
 * 
 */
void litefoc_task_handler(void);


/**
 * @brief 电机转动角度控制
 * 
 */
unsigned char litefoc_angle(float fAngle, unsigned long ulSpeed, float fTorque);


/**
 * @brief 电机转动控制
 * 
 */
unsigned char litefoc_move(t_eMoveDir eMoveDir, unsigned long ulSpeed, float fTorque, unsigned long ulTime);


/**
 * @brief 电机暂停转动
 * 
 */
void litefoc_pause(void);


/**
 * @brief 电机继续转动
 * 
 */
unsigned char litefoc_resume(void);


/**
 * @brief 电机停止转动
 * 
 */
void litefoc_stop(void);


#endif /* __LITEFOC_H__ */
